package us.proyecto.canarios.actions.usuarios;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.ResourceBundle;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.log.Log;

import us.proyecto.canarios.dao.ProvinciaDAO;
import us.proyecto.canarios.dao.UsuarioDAO;
import us.proyecto.canarios.domain.Asociacion;
import us.proyecto.canarios.domain.Criador;
import us.proyecto.canarios.domain.Juez;
import us.proyecto.canarios.domain.Municipio;
import us.proyecto.canarios.domain.Provincia;
import us.proyecto.canarios.domain.Usuario;



@Name("edicionUsuario")
@Scope(ScopeType.SESSION)
public class EdicionUsuarioAction {

    @Logger
    Log log;

    private Usuario usuario;

    @In(create = true)
    private UsuarioDAO usuarioDAO;

    @In(create = true)
    private ProvinciaDAO provinciaDAO;

    /*@In(create = true)
    private Usuario usuarioLogueado;*/

    @In(create = true)
    private ConsultaUsuarioAction consultaUsuario;

    private String passwordUser;

    private String verify;

    private boolean first;
    private int index;



    private String tipo;

    private List<Provincia> listaProvincias;
    private List<Municipio> listaMunicipios;

    private Provincia provinciaSel;
    private Municipio municipioSel;

    private Criador criador;
    private Juez juez;

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }


    public void select() {
        first = true;
        selectUser();
    }
    public void selectUser() {
        if(first==true){
            index=consultaUsuario.getIndex();
            first=false;
        }
        usuario = consultaUsuario.getListaUsuarios().get(index);
    }

    public String guardar() {
        if ((passwordUser != null && verify != null) && (passwordUser.length() > 0 && verify.length() > 0)) {
            if (passwordUser.equals(verify)) {
                usuario.setPass(passwordUser);

            } else {
                FacesMessages.instance().add("No coinciden las contaseñas introducidas.");
                passwordUser = null;
                verify = null;
            }
        } else if (passwordUser == null && verify != null || passwordUser != null && verify == null) {
            FacesMessages.instance().add("Introduzca de nuevo la nueva contraseña y confírmela.");
            passwordUser = null;
            verify = null;
        }
        boolean error = false;
        if(tipo!=null) {
        	if(tipo.equals("1")){
        		usuario.setAdministrador(true);
        	}else if(tipo.equals("2")){
        		usuario.setEsCriador(true);
        		usuario.getCriador().setProvincia(provinciaSel);
        		usuario.getCriador().setMunicipio(municipioSel);
        	}else if(tipo.equals("3")){
        		usuario.setEsJuez(true);
        		usuario.getJuez().setProvincia(provinciaSel);
                usuario.getJuez().setMunicipio(municipioSel);
        	}else if(tipo.equals("4")) {
        	    usuario.getAsociacion().setProvincia(provinciaSel);
        	    usuario.getAsociacion().setMunicipio(municipioSel);
        	}
        } else {
        	FacesMessages.instance().add("Debe seleccionar un tipo de usuario");
            passwordUser = null;
            verify = null;
            error = true;
        }
        if(usuario.getEsAsociacion()){
        	if(usuario.getAsociacion().getEmail() == null  || usuario.getAsociacion().getEmail().equals("")){
        		error = true;
        		FacesMessages.instance().add("Debe introducir un correo eléctronico");
        		return "error";
        	}
        	if(usuario.getAsociacion().getNombre() == null || usuario.getAsociacion().getNombre().equals("")){
        		error = true;
        		FacesMessages.instance().add("Debe introducir el nombre de la asociación");
        		return "error";
        	}
        }else if (usuario.getEsJuez()){
        	if(usuario.getJuez().getEmail() == null  || usuario.getJuez().getEmail().equals("")){
        		error = true;
        		FacesMessages.instance().add("Debe introducir un correo electrónico");
        		return "error";
        	}
        	if(usuario.getJuez().getNumJuez() == null  || usuario.getJuez().getNumJuez().equals("")){
        		error = true;
        		FacesMessages.instance().add("Debe introducir el nº de colegiado");
        		return "error";
        	}
        }else if(usuario.getEsCriador()){
        	if(usuario.getCriador().getNumCriador() == null  || usuario.getCriador().getNumCriador().equals("")){
        		error = true;
        		FacesMessages.instance().add("Debe introducir el nº de afiliación");
        		return "error";
        	}
        }

        if(!error){
	        boolean nuevo=usuario.getIdUsuario()==0;
	        usuario.setPendiente(false);
	        error = comprobarExiste();
	        if(!error) {
		        boolean b=usuarioDAO.save(usuario);


		        /*String texto;
                String subject;
                SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
                Date date = new Date();

                try {
                        String fecha = formato.format(date);

                        texto = "<h1>"
                                        + "<span style='font-family: arial,helvetica,sans-serif;'>"
                                        + "Tikitaka"
                                        + "</span>"
                                        + "</h1>"
                                        + "<h4>"
                                        + "Recordatorio de clave de acceso.<"
                                        + "/h4>"
                                        + "<p>"
                                        + "La clave de acceso vinculada a su cuenta de correo "
                                        + "<span style='color: rgb(0, 0, 255);'>"
                                        + "bersker82@gmail.com"
                                        + "</span>"
                                        + " es:"
                                        + "</p>"
                                        + "<p>"
                                        + "clave: "
                                        + "gratis"
                                        + "</p>"
                                        + "<p>"
                                        + "------------"
                                        + "</p>"
                                        + "<img alt='' src='temas/tiki/imagenes/otros/firma.jpg"
                                        + " style='margin-left: 10px; margin-right: 10px; float: left; width: 158px; height: 167px;'/>"
                                        + "<p>"
                                        + "<span style='font-size: 10px;'>"
                                        + fecha
                                        + "Este es un mensaje autogenerado por tikitaka | 2010."
                                        + "</span>" + "</p>";

                        subject = "Recordatorio password Tikitaka";

                        EnviarMail(subject, texto);
                } catch (Exception e) {
                        FacesMessages.instance().add(
                                        "No se pudo enviar el mail de aviso");
                }*/



		        if(b==true){
		            if(nuevo==true){
		                if(usuario.getEsCriador()){
		                    FacesMessages.instance().add("Usuario almacenado correctamente");
		                    return "exito";
		                }else{
		                    FacesMessages.instance().add("Usuario almacenado correctamente, se le enviará un correo a la dirección indicada anteriormente cuando se revise su alta");
                            return "exito";
		                }
		            }else{
		                FacesMessages.instance().add("Datos de usuario modificados correctamente");
		                return "error";
		            }
		        }else{
		            FacesMessages.instance().add("Error inesperado al guardar");
		            return "error";
		        }
	        }
        }
        return "error";
    }

    private boolean comprobarExiste() {
        List<Usuario> listaUsuarios = usuarioDAO.getListbywhere("nombre = '"+ usuario.getNombre() + "'");
        if(listaUsuarios!= null && listaUsuarios.size()!=0){
            FacesMessages.instance().add("Ya existe un usuario con ese nombre en el sistema");
            return true;
        }
    	if(usuario.getEsAsociacion()){
    		List<Usuario> lista = usuarioDAO.getListbywhere("asociacion.nombre = '"+ usuario.getAsociacion().getNombre() + "'");
    		if(lista== null || lista.size()==0){
    			usuario.setPendiente(true);
    			return false;
    		}else{
    			FacesMessages.instance().add("Ya existe esta asociación");
    			return true;
    		}
    	}else if(usuario.getEsJuez()) {
    		List<Usuario> lista = usuarioDAO.getListbywhere("juez.numJuez = '"+ usuario.getJuez().getNumJuez()+"'");
    		if(lista== null || lista.size()==0){
    			usuario.setPendiente(true);
    		}else{
    			FacesMessages.instance().add("Ya existe este juez");
    			return true;
    		}
    	}else if(usuario.getEsCriador()){
    		List<Usuario> lista = usuarioDAO.getListbywhere("criador.numCriador = '"+ usuario.getCriador().getNumCriador()+"'");
    		if(lista!= null && lista.size()!=0){
    			FacesMessages.instance().add("Ya existe este juez");
    			return true;
    		}
    	}
		return false;
	}

	public void selectAnt() {
        if (index > 0) {
            index--;
            selectUser();
            /*
             * }else if(r.getIndex()== 0 && r.getPage() >1){ r.setIndex(9); r.setPage(r.getPage()-1); selectRodal();
             */
        } else {
            FacesMessages.instance().add("No hay más usuarios anteriores");
        }
    }

    public void selectSig() {
        if (index < consultaUsuario.getListaUsuarios().size() - 1) {
            index++;
            selectUser();
            /*
             * }else if (r.getIndex()==9 && r.getPage() < r.getTotalpag()){ r.setIndex(0); r.setPage(r.getPage()+1); selectRodal();
             */
        } else {
            FacesMessages.instance().add("No hay más usuarios siguientes");
        }
    }

    public String getPasswordUser() {
        return passwordUser;
    }

    public void setPasswordUser(String passwordUser) {
        this.passwordUser = passwordUser;
    }

    public String getVerify() {
        return verify;
    }

    public void setVerify(String verify) {
        this.verify = verify;
    }
    public void nuevo(){
        usuario=new Usuario();
    }

    public boolean esNuevo(){
    	/*if(usuario.getIdUsuario()==0){
    		return true;
    	}*/
    	return true;
    }

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public List<Provincia> getListaProvincias() {
        if(listaProvincias == null){
            listaProvincias = provinciaDAO.getProvincias();
        }
        return listaProvincias;
    }

    public void setListaProvincias(List<Provincia> listaProvincias) {
        this.listaProvincias = listaProvincias;
    }

    public List<Municipio> getListaMunicipios() {
        if(provinciaSel == null){
            listaMunicipios = new ArrayList<Municipio>();
        }else{
            listaMunicipios = provinciaDAO.getMunicipios(""+provinciaSel.getProvincia());
        }
        return listaMunicipios;
    }

    public boolean esCriador(){
    	if(usuario.getCriador()!=null){
    		return true;
    	}
    	return false;
    }

    public boolean esJuez(){
    	if(usuario.getJuez()!=null){
    		return true;
    	}
    	return false;
    }

    public boolean esAsociacion(){
    	if(usuario.getAsociacion()!=null){
    		return true;
    	}
    	return false;
    }

    public void setListaMunicipios(List<Municipio> listaMunicipio) {
        this.listaMunicipios = listaMunicipio;
    }

    public Provincia getProvinciaSel() {
        return provinciaSel;
    }

    public void setProvinciaSel(Provincia provinciaSel) {
        this.provinciaSel = provinciaSel;
    }

    public Municipio getMunicipioSel() {
        return municipioSel;
    }

    public void setMunicipioSel(Municipio municipioSel) {
        this.municipioSel = municipioSel;
    }

    public void cambiaTipo(){
    	if(tipo.equals("1")){
    		usuario.setEsCriador(false);
    		usuario.setEsAsociacion(false);
    		usuario.setEsJuez(false);
    		usuario.setAdministrador(true);
    		usuario.setCriador(null);
    		usuario.setAsociacion(null);
    		usuario.setJuez(null);

    	}else if(tipo.equals("2")){
    		usuario.setCriador(new Criador());
    		usuario.setEsCriador(true);
    		usuario.setEsJuez(false);
    		usuario.setEsAsociacion(false);
    		usuario.setAdministrador(false);
    		if(usuario.getJuez()!=null) {
	    		usuario.getCriador().setNombre(usuario.getJuez().getNombre());
	    		usuario.getCriador().setApellido1(usuario.getJuez().getApellido1());
	    		usuario.getCriador().setApellido2(usuario.getJuez().getApellido2());
	    		usuario.getCriador().setCodigoPostal(usuario.getJuez().getCodigoPostal());
	    		usuario.getCriador().setDni(usuario.getJuez().getDni());
	    		usuario.getCriador().setDomicilio(usuario.getJuez().getDomicilio());
	    		usuario.getCriador().setEmail(usuario.getJuez().getEmail());
	    		usuario.getCriador().setProvincia(usuario.getJuez().getProvincia());
	    		usuario.getCriador().setMunicipio(usuario.getJuez().getMunicipio());
	    		usuario.setJuez(null);
    		}
    		usuario.setAsociacion(null);
    	}else if(tipo.equals("3")){
    		usuario.setJuez(new Juez());
    		usuario.setEsJuez(true);
    		usuario.setEsCriador(false);
    		usuario.setEsAsociacion(false);
    		usuario.setAdministrador(false);
    		if(usuario.getCriador()!=null) {
	    		usuario.getJuez().setNombre(usuario.getCriador().getNombre());
	    		usuario.getJuez().setApellido1(usuario.getCriador().getApellido1());
	    		usuario.getJuez().setApellido2(usuario.getCriador().getApellido2());
	    		usuario.getJuez().setCodigoPostal(usuario.getCriador().getCodigoPostal());
	    		usuario.getJuez().setDni(usuario.getCriador().getDni());
	    		usuario.getJuez().setDomicilio(usuario.getCriador().getDomicilio());
	    		usuario.getJuez().setEmail(usuario.getCriador().getEmail());
	    		usuario.getJuez().setProvincia(usuario.getCriador().getProvincia());
	    		usuario.getJuez().setMunicipio(usuario.getCriador().getMunicipio());
	    		usuario.setCriador(null);
    		}
    		usuario.setAsociacion(null);
    	}else if(tipo.equals("4")){
    		usuario.setAsociacion(new Asociacion());
    		usuario.setEsAsociacion(true);
    		usuario.setEsCriador(false);
    		usuario.setEsJuez(false);
    		usuario.setAdministrador(false);
    		if(usuario.getCriador()!=null) {
	    		usuario.getAsociacion().setNombre(usuario.getCriador().getNombre());
	    		usuario.getAsociacion().setCodigoPostal(usuario.getCriador().getCodigoPostal());
	    		usuario.getAsociacion().setDomicilio(usuario.getCriador().getDomicilio());
	    		usuario.getAsociacion().setEmail(usuario.getCriador().getEmail());
	    		usuario.getAsociacion().setProvincia(usuario.getCriador().getProvincia());
	    		usuario.getAsociacion().setMunicipio(usuario.getCriador().getMunicipio());
	    		usuario.setCriador(null);
    		}else if(usuario.getJuez()!=null) {
	    		usuario.getAsociacion().setNombre(usuario.getJuez().getNombre());
	    		usuario.getAsociacion().setCodigoPostal(usuario.getJuez().getCodigoPostal());
	    		usuario.getAsociacion().setDomicilio(usuario.getJuez().getDomicilio());
	    		usuario.getAsociacion().setEmail(usuario.getJuez().getEmail());
	    		usuario.getAsociacion().setProvincia(usuario.getJuez().getProvincia());
	    		usuario.getAsociacion().setMunicipio(usuario.getJuez().getMunicipio());
	    		usuario.setJuez(null);
    		}
    	}else{
    		usuario.setAdministrador(true);
    		usuario.setCriador(null);
    		usuario.setJuez(null);
    		usuario.setAsociacion(null);
    	}
    }


    private void EnviarMail(String subject, String texto) {

        Properties props = new Properties();

        String servidorSmtp = ResourceBundle.getBundle("mail").getString(
                        "mail.smtp.host");
        String tls = ResourceBundle.getBundle("mail").getString(
                        "mail.smtp.starttls.enable");
        String puerto = ResourceBundle.getBundle("mail").getString(
                        "mail.smtp.port");
        String usuarioSMTP = ResourceBundle.getBundle("mail").getString(
                        "mail.smtp.user");
        String aunteticacion = ResourceBundle.getBundle("mail").getString(
                        "mail.smtp.auth");
        String pass = ResourceBundle.getBundle("mail").getString("mail.pass");
        String from = ResourceBundle.getBundle("mail").getString("mail.from");

        // Nombre del host de correo, es smtp.gmail.com
        props.setProperty("mail.smtp.host", servidorSmtp);

        // TLS si está disponible
        props.setProperty("mail.smtp.starttls.enable", tls);

        // Puerto de gmail para envio de correos
        props.setProperty("mail.smtp.port", puerto);

        // Nombre del usuario
        props.setProperty("mail.smtp.user", usuarioSMTP);

        // Si requiere o no usuario y password para conectarse.
        props.setProperty("mail.smtp.auth", aunteticacion);

        Session session = Session.getDefaultInstance(props);
        session.setDebug(true);

        MimeMessage message = new MimeMessage(session);

        try {

                // Quien envia el correo
                message.setFrom(new InternetAddress(from));

                // A quien va dirigido
                message.addRecipient(Message.RecipientType.TO, new InternetAddress(
                                "bersker82@gmail.com"));

                // Establecemos el asunto
                message.setSubject(subject);
                // añadimos el texto en formato web
                message.setText(texto, "ISO-8859-1", "html");

                Transport t = session.getTransport("smtp");

                t.connect(usuarioSMTP, pass);
                t.sendMessage(message, message.getAllRecipients());
                t.close();

        } catch (AddressException e) {
                FacesMessages
                                .instance()
                                .add(
                                                "No se pudo enviar email de notificación (dirección incorrecta)");
                e.printStackTrace();
        } catch (MessagingException e) {
                FacesMessages.instance().add(
                                "No se pudo enviar email de notificación");
                // TODO Auto-generated catch block
                e.printStackTrace();
        }

}



}
